<?php
///////////////////////////////////////////////////////////////////////////////
//
// archivo.class.php
//
///////////////////////////////////////////////////////////////////////////////
//
// Esta clase se implemento para el manejo de los archivos
//
// Nota para evitar algun cinflicto de  codificacion se omitiran las tildes y 
// demas acentos
// 
// Autor: Juan Diego Ocampo Q.
// Fecha de Creacin: 03/07/2008
// 
// Modificaciones:
// 
///////////////////////////////////////////////////////////////////////////////


///////////////////////////////////////////////////////////////////////////////
// class Archivo
// Se utiliza para manejar los archivos
///////////////////////////////////////////////////////////////////////////////

class Archivo 
{
	//////////////////////////////////////////////////////////////////////////////////////
	// puntero al archivo
	//////////////////////////////////////////////////////////////////////////////////////
	private $fileHandle;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// modo con el que se abrira el archivo
	//////////////////////////////////////////////////////////////////////////////////////
	private $modo;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// tipo de archivo (extension)
	//////////////////////////////////////////////////////////////////////////////////////
	private $tipoArchivo;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// ruta donde se encuentra el archivo original
	//////////////////////////////////////////////////////////////////////////////////////
	private $rutaOrigen;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// nombre del archivo original
	//////////////////////////////////////////////////////////////////////////////////////
	private $nombreOrigen;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// ruta donde se graba el archivo
	//////////////////////////////////////////////////////////////////////////////////////
	private $rutaDestino;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// nombre con el cual se graba el archivo
	//////////////////////////////////////////////////////////////////////////////////////
	private $nombreDestino;
	
	//////////////////////////////////////////////////////////////////////////////////////
	// fecha de alta del archivo
	//////////////////////////////////////////////////////////////////////////////////////
	private $fecha;
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Constructor de clase. 
	// inicializa los atributos de la clase con los valores 
	// 
	//
	// parameter: 
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function __construct()
	{
		$this->fileHandle = "";
		$this->modo = "r";
		$this->extension = "";
		
		$this->rutaOrigen = "";
		$this->nombreOrigen = "";
		
		$this->rutaDestino = "";
		$this->nombreDestino = "";
		
		$this->fecha = "";
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// retorna el valor de un atributo especificado
	// 
	//
	// parameter: $atributo especifica cual atributo se debe retornar
	// return: valor del atributo
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function obtenerAtributo($atributo)
	{
		switch($atributo)
		{
			case "fileHandle": 		return $this->fileHandle; break;
			case "modo": 					return $this->modo; break;
			case "extension": 		return $this->extension; break;
			case "rutaOrigen": 		return $this->rutaOrigen; break;
			case "nombreOrigen": 	return $this->nombreOrigen; break;
			case "rutaDestino": 	return $this->rutaDestino; break;
			case "nombreDestino": return $this->nombreDestino; break;
			case "fecha": 				return $this->fecha; break;
		}
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Asigna el valor especifico al atributo de la clase.
	// 
	//
	// parameter: $atributo especifica cual atributo al cual se le debe incluir el valor.
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacin: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function configurarAtributo($atributo,$valor)
	{
		switch($atributo)
		{
			case "fileHandle": 		$this->fileHandle = $valor; break;
			case "modo": 					$this->modo = $valor; break;
			case "extension": 		$this->extension = $valor; break;
			case "rutaOrigen": 		$this->rutaOrigen = $valor; break;
			case "nombreOrigen": 	$this->nombreOrigen = $valor; break;
			case "rutaDestino": 	$this->rutaDestino = $valor; break;
			case "nombreDestino": $this->nombreDestino = $valor; break;
			case "fecha": 				$this->fecha = $valor; break;
		}
	}
	
	
	///////////////////////////////////////////////////////////////////////////////
	// subirArchivo. copia un archivo en la ruta especificada
	//
	// parameter: $nombreOrigen es el nombre temporal del archivo (se genera 
	//            automaticamente al subir trel al ruta implicita)
	// parameter: $rutaDestino ruta destino a donde se grabara el archivo
	// parameter: $nombreDestino nombre como se grabara el archivo
	// parameter: $reemplazar indica si se remplaza el archivo existente o no 
	//            (agrega datatime al nombre del archivo para evitar remplazo de un archivo)
	// parameter: $extensiones arreglo de tipos de achivos en minuscula permitidos en el upload
	//            se envia vacia si se permiten todos las extensiones
	//
	// return: 1 exitosa.
	// return: -1 Error al subir el archivo o no existe el archivo.
	// return: -2 Error de tipo si extension no es valida.
	//
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacin: 03/07/2008
	///////////////////////////////////////////////////////////////////////////////
	public function subirArchivo($nombreOrigen, $rutaDestino, $nombreDestino, $reemplazar=false, $extensiones="")
	{
		
		$ext = explode(".", $nombreDestino);
		$extension = $ext[count($ext)-1];
		
		if($ext == "")
		{
			return -2;
		}
		
		if(is_uploaded_file($nombreOrigen))
		{
			if(is_array($extensiones))
			{
				// validar si es extension valida
				if(in_array(strtolower($extension), $extensiones) == false)
				{
					return -2;
				}
			}
			
			$fecha = date("YmdHis");
			if($reemplazar == false)
			{
				$ext = explode(".", $nombreDestino);
				$ext[count($ext)-1] = $fecha.".".$ext[count($ext)-1];
				$nombreArchivo = implode("_", $ext);
			}
			else
			{
				$nombreArchivo = $nombreDestino;
			}
			
			if(move_uploaded_file($nombreOrigen, $rutaDestino.$nombreArchivo) != false)
			{
				chmod($rutaDestino.$nombreArchivo, 0777);  
				
				$this->extension = $extension;
				$this->nombreOrigen = $nombreOrigen;
				$this->rutaDestino = $rutaDestino;
				$this->nombreDestino = $nombreArchivo;
				$this->fecha = $fecha;
				
				return 1;
			}
			else
			{
				return -1;
			}
		}
		else
		{
			return -1; 
		}
	}
	
	
	///////////////////////////////////////////////////////////////////////////////
	// Elimina un archivo especificado
	//
	// parameter: $nombreArchivo es el nombre del archivo
	//
	// return: 1 exitosa.
	// return: -1 error.
	//
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacin: 03/07/2008
	///////////////////////////////////////////////////////////////////////////////
	public function eliminarArchivo($nombreArchivo)
	{	
		if(@unlink($nombreArchivo) != false)
		{
			return 1;
		}
		else
		{
			return -1;
		}
	}
	
	
	///////////////////////////////////////////////////////////////////////////////
	// Elimina un directorio especificado con todo su contenido
	//
	// parameter: $nombreDir es el nombre del directorio ( debe terminar con el caracter "/" )
	//
	// return: 1 exitosa.
	// return: -1 error.
	// return: -2 no es un directorio.
	//
	// access public
	//
	// Autor: Martha Lucia Vargas Mateus
	// Fecha de Creacin: 05/02/2008
	//
	// Modificacin:
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacin: 03/07/2008
	///////////////////////////////////////////////////////////////////////////////
	public function eliminarDirectorio($nombreDir) 
	{
		if(is_dir($nombreDir)) 
		{
			$entries = array();
			
			if ($ar = opendir($nombreDir)) 
			{
				while(false !== ($file = readdir($ar))) 
				{ 
					if($file != "." && $file != "..")
					{ 
						$entry = $file;
						if($entry != '.' && $entry != '..') 
						{
							if(is_file($nombreDir.$entry))
							{
								if($this->eliminarArchivo($nombreDir.$entry) == -1)
								{
									return -1;
								}
							}
							elseif(is_dir($nombreDir.$entry))
							{
								if(borrarDirectorio($nombreDir.$entry."/") == -1)
								{
									return -1;
								}
							}
						}
					} 
				}
				closedir($ar);
			}
			
			if(rmdir($nombreDir) != false)
			{
				return 1;
			}
			else
			{
				return -1;
			}
		}
		return -2; 
	}
	
	
	
	
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Abre un archivo, si no existe lo crea, inicializa los atributos
	// 
	//
	// parameter: $rutaOrigen indica la ruta donde se encuentra el archivo
	// parameter: $nombreOrigen indica el nombre del archivo
	// parameter: $modo indica el modo como debe abrirse el archivo
	// return: 1 en caso de exito
	// return: -1 en caso error
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function abrirArchivo($rutaOrigen, $nombreOrigen, $modo) 
	{
		if(file_exists($rutaOrigen.$nombreOrigen)) 
		{
			$pArchivo = fopen ($rutaOrigen.$nombreOrigen, $modo);
		}
		else 
		{
			$pArchivo = fopen ($rutaOrigen.$nombreOrigen, 'w+');
			//$this->cerrarArchivo();
		}
		
		if($pArchivo != false)
		{
			$this->rutaOrigen = $rutaOrigen;
			$this->nombreOrigen = $nombreOrigen;
			$this->modo = $modo;
			$this->fileHandle = $pArchivo;
			return 1;
		}
		else
		{
			return -1;
		}
	}
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Cierra el archivo
	// 
	//
	// parameter:
	// return: 
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function cerrarFile()
	{
		fclose($this->fileHandle);
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Lee la fecha de la ultima modificacion del archivo
	// 
	//
	// return: la fecha de modificacion del archivo
	// return: -1 en caso de error
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function leerFechaModificado() {
		$fechaModificado = filectime($this->rutaOrigen.$this->nombreOrigen);
		clearstatcache();
		if($fechaModificado != false)
		{
			return $fechaModificado;
		}
		else
		{
			return -1;
		}
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Lee el tamao del archivo
	// 
	//
	// parameter: $rutaOrigen indica la ruta donde se encuentra el archivo
	// parameter: $nombreOrigen indica el nombre del archivo
	// return: el tamao del archivo
	// return: -1 en caso de error
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function leerTamanio() {
		$tamanio = filesize($this->rutaOrigen.$this->nombreOrigen);
		clearstatcache();
		if($tamanio != false)
		{
			return $tamanio;
		}
		else
		{
			return -1;
		}
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Lee del archivo una longitud en bytes especificada
	// 
	//
	// parameter: $longitud cantidad de bytes a leer
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function leerArchivo($longitud) {
		return fread($this->fileHandle, $longitud);
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// Lee del archivo hasta encontrar un salto de linea o el fin del archivo
	// 
	//
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function leerLinea() {
		$linea = '';
		$caracter = '';
		while($caracter != chr(13) && !feof($this->fileHandle)) {
			$caracter = fgetc($this->fileHandle);
			if($caracter != chr(13) && $caracter != chr(10)) {
				$linea .= $caracter;
			}
		}
		return $linea;
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// escribe en el archivo la cadena especificada en la posicion actual del puntero
	// 
	//
	// parameter: $cadena valor a escribir en el archivo
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function escribir($cadena) {
		fwrite($this->fileHandle, $cadena);
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// escribe en el archivo la cadena especificada al inicio del archivo
	// 
	//
	// parameter: $cadena valor a escribir
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function escribirAlInicio($cadena) {
		rewind($this->fileHandle);
		$this->escribir($cadena);
	}
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// escribe en el archivo la cadena especificada al final del archivo
	// 
	//
	// parameter: $cadena valor a escribir
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function escribirAlFinal($cadena) {
		$this->posicionar($this->leerTamanio());
		$this->escribir($cadena);
	}
	
	
	
	//////////////////////////////////////////////////////////////////////////////////////
	// posiciona el puntero al archivo
	// 
	//
	// parameter: $posicion valor a escribir
	// return: string
	// access public
	//
	// Autor: Juan Diego Ocampo Q.
	// Fecha de Creacion: 03/07/2008
	//////////////////////////////////////////////////////////////////////////////////////
	public function posicionar($posicion) {
		fseek($this->fileHandle, $posicion);
	}
}
?>